package net.yla.smartbus.module.ba.dataServer.service.impl;

import com.vip.vjtools.vjkit.collection.ListUtil;
import com.vip.vjtools.vjkit.mapper.BeanMapper;
import net.yla.smartbus.core.base.BaseService;
import net.yla.smartbus.module.ba.dataServer.dto.*;
import net.yla.smartbus.module.ba.dataServer.entity.*;
import net.yla.smartbus.module.ba.dataServer.mapper.DataServerDOMapper;
import net.yla.smartbus.module.ba.dataServer.query.DataServerQuery;
import net.yla.smartbus.module.ba.dataServer.query.DeviceDataServerQuery;
import net.yla.smartbus.module.ba.dataServer.query.VersionInfoQuery;
import net.yla.smartbus.module.ba.dataServer.service.DataServerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 *@author:LiuJie
 *@date:2020/9/24
 *@description:数据服务器
 */
@Service
public class DataServerServiceImpl extends BaseService implements DataServerService {


    @Autowired
    private DataServerDOMapper dataServerDOMapper;


    /**
     * 设备主键集合
     * @return
     */
    @Override
    public List<Integer> listDeviceId(DataServerQuery query) {
        return dataServerDOMapper.listDeviceId(query);
    }

    /**
     * 查询指定设备信息
     * @param query
     * @return
     */
    @Override
    public List<DataServerDTO> listByDeviceQuery(DeviceDataServerQuery query) {
        List<DataServerDTO> dtoList = new ArrayList<>();
        List<DataServerDTO> dataServerDTOS = dataServerDOMapper.listByDeviceQuery(query);
        for (DataServerDTO serverDTO :dataServerDTOS){
            DataServerDTO dto = new DataServerDTO();
            dto.setVehicleId(serverDTO.getVehicleId());
            dto.setSim(serverDTO.getSim());
            dto.setNumber(serverDTO.getNumber());
            dto.setId(serverDTO.getId());
            dto.setVersion(serverDTO.getVersion());
            dto.setType(serverDTO.getType());
            dto.setProtocol(serverDTO.getProtocol());
            dtoList.add(dto);
        }
        return dtoList;
    }


    /**
     * 获取所有车辆列表
     * @return
     */
    @Override
    public List<Integer> listVehicleId(DataServerQuery query) {
        return dataServerDOMapper.listVehicleId(query);
    }


    /**
     * 获取指定列表的车辆信息
     * @param query
     * @return
     */
    @Override
    public List<VehicleInfoDTO> listVehicleInfo(DeviceDataServerQuery query) {
        List<VehicleInfoDTO> dtoList = new ArrayList<>();
        List<VehicleInfoDTO> list = dataServerDOMapper.listVehicleInfo(query);
        if (ListUtil.isEmpty(list)){
            return dtoList;
        }
        for (VehicleInfoDTO vehicleInfoDTO :list){
            VehicleInfoDTO dto = BeanMapper.map(vehicleInfoDTO,VehicleInfoDTO.class);
            Integer limitSpeed = dataServerDOMapper.selectDeviceLimitSpeed(vehicleInfoDTO.getId());
            if (limitSpeed!=null){
                dto.setLimit(limitSpeed);
            }else {
                dto.setLimit(0);
            }
            dtoList.add(dto);
        }
        return dtoList;
    }

    /**
     * 获取所有线路列表
     * @return
     */
    @Override
    public List<Integer> listRoutes(DataServerQuery query) {
        return dataServerDOMapper.listRoutes(query);
    }


    /**
     * 查询指定列表的线路信息
     * @param query
     * @return
     */
    @Override
    public List<RoutesInfoDTO> listRoutesInfo(DeviceDataServerQuery query) {
        List<RoutesInfoDTO> list = dataServerDOMapper.listRoutesInfo(query);
        List<RoutesInfoDTO> dtoList = new ArrayList<>(list.size());
        for (RoutesInfoDTO routesInfoDTO : list){
            RoutesInfoDTO dto = new RoutesInfoDTO();
            dto.setId(routesInfoDTO.getId());
            dto.setName(routesInfoDTO.getName());
            //dto.setLines(dataServerDOMapper.listLines(routesInfoDTO.getId()));
            dto.setVersion(routesInfoDTO.getVersion());
            dtoList.add(dto);
        }
        return dtoList;
    }


    /**
     * 查询指定线路列表的支线信息
     * @param query
     * @return
     */
    @Override
    public List<LinesInfoDTO> listLinesInfo(DeviceDataServerQuery query) {
        List<LinesInfoDO> list = dataServerDOMapper.listLinesInfo(query);
        List<LinesInfoDTO> dtoList = new ArrayList<>(list.size());
        for (LinesInfoDO linesInfoDO :list){
            LinesInfoDTO dto = new LinesInfoDTO();
            dto.setId(linesInfoDO.getId());
            dto.setName(linesInfoDO.getName());
            dto.setCode(linesInfoDO.getCode());
            //支线类型为0 未设置
            if (linesInfoDO.getLineType()==0) {
                List<LatLngDO> latLngDOS = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), linesInfoDO.getLineType());
                for (LatLngDO latLngDO :latLngDOS){
                    List<Double> doubleList = new ArrayList<>();
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                    dto.setUp(doubleList);
                }
            }
            //支线类型为1 常规线（上下行）；
            if (linesInfoDO.getLineType()==1) {
                //上行
                List<LatLngDO> latLngDOS = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 1);
                for (LatLngDO latLngDO :latLngDOS){
                    List<Double> doubleList = new ArrayList<>();
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                    dto.setUp(doubleList);
                }
                //下行
                List<LatLngDO> latLngDOList = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 2);
                for (LatLngDO latLngDO :latLngDOList){
                    List<Double> doubleList = new ArrayList<>();
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                    dto.setDown(doubleList);
                }
            }
            //支线类型为2，单线
            if (linesInfoDO.getLineType()==2) {
                List<LatLngDO> latLngDOS = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 0);
                for (LatLngDO latLngDO :latLngDOS){
                    List<Double> doubleList = new ArrayList<>();
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                    dto.setUp(doubleList);
                }
            }
            //支线类型为3 环形
            if (linesInfoDO.getLineType()==3) {
                List<LatLngDO> latLngDOList1 = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 3);
                for (LatLngDO latLngDO :latLngDOList1){
                    List<Double> doubleList = new ArrayList<>();
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                    dto.setUp(doubleList);
                }
            }
            if (dto.getUp()==null) {
                List<Double> doubleList = new ArrayList<>();
                dto.setUp(doubleList);
            }
            if (dto.getDown()==null) {
                List<Double> doubleList = new ArrayList<>();
                dto.setDown(doubleList);
            }
            dtoList.add(dto);
        }
        return dtoList;
    }


    /**
     * 获取支线关联的站台列表
     * @param query
     * @return
     */
    @Override
    public List<StandLineDTO> listStandLine(DeviceDataServerQuery query) {
        List<StandLineRLDO> list = dataServerDOMapper.listStandByLine(query);
        List<StandLineDTO> dtoList = new ArrayList<>(list.size());
        for (StandLineRLDO standLineRLDO: list){
            StandLineDTO dto = new StandLineDTO();
            dto.setId(standLineRLDO.getId());
            dto.setVersion(standLineRLDO.getVersion());
            //未设置
            if (standLineRLDO.getLineType()==0) {
                List<Integer> listStandId = dataServerDOMapper.listStandId(standLineRLDO.getId(), standLineRLDO.getLineType());
                dto.setUp(listStandId);
            }else if (standLineRLDO.getLineType()==1){
                //上下行
                //上行
                List<Integer> integerList = dataServerDOMapper.listStandId(standLineRLDO.getId(), 1);
                dto.setUp(integerList);
                //下行
                List<Integer> listStandId = dataServerDOMapper.listStandId(standLineRLDO.getId(), 2);
                dto.setDown(listStandId);
            }else if (standLineRLDO.getLineType()==2){
                //单线
                List<Integer> listStandId = dataServerDOMapper.listStandId(standLineRLDO.getId(), 0);
                dto.setUp(listStandId);
            }else if (standLineRLDO.getLineType()==3){
                //环线
                List<Integer> listStandId = dataServerDOMapper.listStandId(standLineRLDO.getId(), 3);
                dto.setUp(listStandId);
            }
            if (dto.getUp()==null) {
                List<Integer> integerList = new ArrayList<>();
                dto.setUp(integerList);
            }
            if (dto.getDown()==null){
                List<Integer> integerList = new ArrayList<>();
                dto.setDown(integerList);
            }
            dtoList.add(dto);
        }
        return dtoList;
    }


    /**
     * 获取所有的站点列表
     * @return
     */
    @Override
    public List<Integer> listStationId(DataServerQuery query) {
        return dataServerDOMapper.listStationId(query);
    }

    /**
     * 查询指定站点列表的站点信息
     * @param query
     * @return
     */
    @Override
    public List<StationInfoDTO> listStationInfo(DeviceDataServerQuery query) {
        List<StationInfoDTO> list = dataServerDOMapper.listStationInfo(query);
        List<StationInfoDTO> dtoList = new ArrayList<>(list.size());
        for (StationInfoDTO stationInfoDTO : list){
            StationInfoDTO dto = new StationInfoDTO();
            dto.setId(stationInfoDTO.getId());
            dto.setName(stationInfoDTO.getName());
            dto.setVersion(stationInfoDTO.getVersion());
            //dto.setStands(dataServerDOMapper.listStandIds(stationInfoDTO.getId()));
            dtoList.add(dto);
        }
        return dtoList;
    }


    /**
     * 查询指定站台列表的站点信息
     * @param query
     * @return
     */
    @Override
    public List<StandByStandIdDTO> listStandByStandId(DeviceDataServerQuery query) {
        return dataServerDOMapper.listStandByStandId(query);
    }

    /**
     * 查询驾驶员列表
     * @return
     */
    @Override
    public List<Integer> listDriverId(DataServerQuery query) {
        return dataServerDOMapper.listDriverId(query);
    }

    /**
     * 查询驾驶员信息
     * @param query
     * @return
     */
    @Override
    public List<DriverInfoDTO> listDriverInfo(DeviceDataServerQuery query) {
        List<DriverInfoDTO> list = dataServerDOMapper.listDriverInfo(query);
        List<DriverInfoDTO> dtoList = new ArrayList<>(list.size());
        for (DriverInfoDTO driverInfoDTO : list){
            DriverInfoDTO dto = new DriverInfoDTO();
            dto.setId(driverInfoDTO.getId());
            dto.setName(driverInfoDTO.getName());
            if (driverInfoDTO.getCard()!=null) {
                dto.setCard(driverInfoDTO.getCard());
            }else {
                dto.setCard("");
            }
            dto.setVersion(driverInfoDTO.getVersion());
            dtoList.add(dto);
        }
        return dtoList;
    }

    /**
     * 查询支线列表信息
     * @return
     */
    @Override
    public List<Integer> listLineId(DataServerQuery query) {
        return dataServerDOMapper.listLineId(query);
    }

    /**
     * 获取所有站台信息
     * @return
     */
    @Override
    public List<Integer> listStandIdInfo(DataServerQuery query) {
        return dataServerDOMapper.listStandIdInfo(query);
    }

    /**
     * 查询指定支线列表的支线信息
     * @param query
     * @return
     */
    @Override
    public List<LineInfoByQueryDTO> listLineInfo(DeviceDataServerQuery query) {
        List<LinesInfoDO> list = dataServerDOMapper.listLinesInfo(query);
        List<LineInfoByQueryDTO> dtoList = new ArrayList<>(list.size());
        for (LinesInfoDO linesInfoDO :list){
            LineInfoByQueryDTO dto = new LineInfoByQueryDTO();
            //主键id
            dto.setId(linesInfoDO.getId());
            //所属线路id
            dto.setRoute(linesInfoDO.getRouteId());
            //线路名称
            dto.setName(linesInfoDO.getName());
            //线路编码
            dto.setCode(linesInfoDO.getCode());
            //当前版本
            dto.setVersion(linesInfoDO.getVersion());
            //上下行限速
            List<Integer> limitSpeed=new ArrayList<>();
            limitSpeed.add(linesInfoDO.getUpLimitSpeed());
            limitSpeed.add(linesInfoDO.getDownLimitSpeed());
            dto.setLimits(limitSpeed);
            LatLneListDO latLneListDO  = new LatLneListDO();
            //上下行经纬度
            if (linesInfoDO.getLineType()==0) {
                List<LatLngDO> latLngDOS = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), linesInfoDO.getLineType());
                List<Double> doubleList = new ArrayList<>();
                for (LatLngDO latLngDO :latLngDOS){
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                }
                latLneListDO.setUp(doubleList);
            }
            //支线类型为1 常规线（上下行）；
            if (linesInfoDO.getLineType()==1) {
                //上行
                List<LatLngDO> latLngDOS = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 1);
                List<Double> doubleList = new ArrayList<>();
                for (LatLngDO latLngDO :latLngDOS){
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                }
                latLneListDO.setUp(doubleList);
                //下行
                List<LatLngDO> latLngDOList = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 2);
                List<Double> doubleList1 = new ArrayList<>();
                for (LatLngDO latLngDO :latLngDOList){
                    doubleList1.add(latLngDO.getLatitude());
                    doubleList1.add(latLngDO.getLongitude());
                }
                latLneListDO.setDown(doubleList1);
            }
            //支线类型为2，单线
            if (linesInfoDO.getLineType()==2) {
                List<LatLngDO> latLngDOS = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 0);
                List<Double> doubleList = new ArrayList<>();
                for (LatLngDO latLngDO :latLngDOS){
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                }
                latLneListDO.setUp(doubleList);
            }
            //支线类型为3 环形
            if (linesInfoDO.getLineType()==3) {
                List<LatLngDO> latLngDOList1 = dataServerDOMapper.listLinesLatLng(linesInfoDO.getId(), 3);
                List<Double> doubleList = new ArrayList<>();
                for (LatLngDO latLngDO :latLngDOList1){
                    doubleList.add(latLngDO.getLatitude());
                    doubleList.add(latLngDO.getLongitude());
                }
                latLneListDO.setUp(doubleList);
            }
            if (latLneListDO.getUp()==null){
                List<Double> doubleList = new ArrayList<>();
                latLneListDO.setUp(doubleList);
            }
            if (latLneListDO.getDown()==null){
                List<Double> doubleList = new ArrayList<>();
                latLneListDO.setDown(doubleList);
            }
            //上下行经纬度
            dto.setCoords(latLneListDO);
            //上下行站台id
            StandListDO standListDO = new StandListDO();
            //未设置
            if (linesInfoDO.getLineType()==0) {
                List<Integer> listStandId = dataServerDOMapper.listStandId(linesInfoDO.getId(), linesInfoDO.getLineType());
                standListDO.setUp(listStandId);
            }else if (linesInfoDO.getLineType()==1){
                //上下行
                //上行
                List<Integer> integerList = dataServerDOMapper.listStandId(linesInfoDO.getId(), 1);
                standListDO.setUp(integerList);
                //下行
                List<Integer> listStandId = dataServerDOMapper.listStandId(linesInfoDO.getId(), 2);
                standListDO.setDown(listStandId);
            }else if (linesInfoDO.getLineType()==2){
                //单线
                List<Integer> listStandId = dataServerDOMapper.listStandId(linesInfoDO.getId(), 0);
                standListDO.setUp(listStandId);
            }else if (linesInfoDO.getLineType()==3){
                //环线
                List<Integer> listStandId = dataServerDOMapper.listStandId(linesInfoDO.getId(), 3);
                standListDO.setUp(listStandId);
            }
            if (standListDO.getUp()==null) {
                List<Integer> integerList = new ArrayList<>();
                standListDO.setUp(integerList);
            }
            if (standListDO.getDown()==null){
                List<Integer> integerList = new ArrayList<>();
                standListDO.setDown(integerList);
            }
            dto.setStands(standListDO);
            dtoList.add(dto);
        }
        return dtoList;
    }

    /**
     * 查询记录版本更新信息
     * @param query
     * @return
     */
    @Override
    public List<VersionInfoDTO> listVersion(VersionInfoQuery query) {
        List<VersionInfoDTO> dtoList = new ArrayList<>();
        //设备
        if (query.getType()==1){
            if (query.getId()==null||query.getId().size()==0){
                VersionInfoDTO versionInfoDTO = dataServerDOMapper.selectDeviceVersion();
                dtoList.add(versionInfoDTO);
                return dtoList;
            }else {
                List<VersionInfoDTO> versionInfoDTOS = dataServerDOMapper.listDeviceVersion(query);
                return versionInfoDTOS;
            }
        }else if (query.getType()==2){
            //车辆
            if (query.getId()==null||query.getId().size()==0){
                VersionInfoDTO versionInfoDTO = dataServerDOMapper.selectVehicleVersion();
                dtoList.add(versionInfoDTO);
                return dtoList;
            }else {
                List<VersionInfoDTO> versionInfoDTOS = dataServerDOMapper.listVehicleVersion(query);
                return versionInfoDTOS;
            }
        }else if (query.getType()==3){
            //线路
            if (query.getId()==null||query.getId().size()==0){
                VersionInfoDTO versionInfoDTO = dataServerDOMapper.selectRouteVersion();
                dtoList.add(versionInfoDTO);
                return dtoList;
            }else {
                List<VersionInfoDTO> versionInfoDTOS = dataServerDOMapper.listRouteVersion(query);
                return versionInfoDTOS;
            }
        }else if (query.getType()==4){
            //支线
            if (query.getId()==null||query.getId().size()==0){
                VersionInfoDTO versionInfoDTO = dataServerDOMapper.selectLineVersion();
                dtoList.add(versionInfoDTO);
                return dtoList;
            }else {
                List<VersionInfoDTO> versionInfoDTOS = dataServerDOMapper.listLineVersion(query);
                return versionInfoDTOS;
            }
        }else if (query.getType()==5){
            //站点
            if (query.getId()==null||query.getId().size()==0){
                VersionInfoDTO versionInfoDTO = dataServerDOMapper.selectStationVersion();
                dtoList.add(versionInfoDTO);
                return dtoList;
            }else {
                List<VersionInfoDTO> versionInfoDTOS = dataServerDOMapper.listStationVersion(query);
                return versionInfoDTOS;
            }
        }else if (query.getType()==6){
            //站台
            if (query.getId()==null||query.getId().size()==0){
                VersionInfoDTO versionInfoDTO = dataServerDOMapper.selectStandVersion();
                dtoList.add(versionInfoDTO);
                return dtoList;
            }else {
                List<VersionInfoDTO> versionInfoDTOS = dataServerDOMapper.listStandVersion(query);
                return versionInfoDTOS;
            }
        }else if (query.getType()==7){
            //驾驶员
            if (query.getId()==null||query.getId().size()==0){
                VersionInfoDTO versionInfoDTO = dataServerDOMapper.selectDriverVersion();
                dtoList.add(versionInfoDTO);
                return dtoList;
            }else {
                List<VersionInfoDTO> versionInfoDTOS = dataServerDOMapper.listDriverVersion(query);
                return versionInfoDTOS;
            }
        }
        VersionInfoDTO dto = new VersionInfoDTO();
        dto.setId(0);
        dto.setVersion(0);
        dtoList.add(dto);
        return dtoList;
    }
}
